home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vgacodng / part07_d.pas < prev    next >
Pascal/Delphi Source File  |  1996-11-22  |  4KB  |  143 lines

  1. {$G+}
  2. program ShadeBob3;
  3.  
  4. uses crt;
  5.  
  6. const VGA : word = $A000;
  7.       SinOfs = 40;        { Offset                     }
  8.       SinAmp = 50;        { Amplitude                  }
  9.       SinLen = 255;       { und Länge der Sinustabelle }
  10.       SprPic : array[0..15,0..15] of byte = (
  11.         (0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0),
  12.         (0,0,0,0,2,2,3,3,3,3,2,2,0,0,0,0),
  13.         (0,0,0,2,3,3,3,3,3,3,3,3,2,0,0,0),
  14.         (0,0,2,3,3,3,3,3,3,3,3,3,3,2,0,0),
  15.         (0,2,3,3,3,3,3,3,3,3,3,3,3,3,2,0),
  16.         (0,2,3,3,3,3,3,3,3,3,3,3,3,3,2,0),
  17.         (2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2),
  18.         (2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2),
  19.         (2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2),
  20.         (2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2),
  21.         (0,2,3,3,3,3,3,3,3,3,3,3,3,3,2,0),
  22.         (0,2,3,3,3,3,3,3,3,3,3,3,3,3,2,0),
  23.         (0,0,2,3,3,3,3,3,3,3,3,3,3,2,0,0),
  24.         (0,0,0,2,3,3,3,3,3,3,3,3,2,0,0,0),
  25.         (0,0,0,0,2,2,3,3,3,3,2,2,0,0,0,0),
  26.         (0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0)
  27.       );
  28.  
  29. var SinTab : array[0..SinLen] of word;
  30.     Pal : array[0..767] of byte;
  31.     X,Y,n       : integer;
  32.     I1,I2,J1,J2 : byte;
  33.  
  34. procedure SetPalette;assembler;    { Setzt die Palette in Pal }
  35. asm
  36.   mov     dx,3C8h
  37.   xor     al,al
  38.   out     dx,al
  39.   mov     cx,768
  40.   mov     dx,3C9h
  41.   mov     si,offset pal
  42. @Jmp1:
  43.   lodsb
  44.   out     dx,al
  45.   loop    @Jmp1
  46. end;
  47.  
  48. procedure BluePal;   { Schreibt eine blaue Palette in Pal setzt sie mittels }
  49. var loop : integer;  { SetPalette }
  50.  
  51. begin
  52.   for loop := 0 to 31 do begin
  53.     pal[loop*3+2] := loop * 2;
  54.     pal[(63-loop)*3+2] := loop * 2;
  55.     pal[(loop+64)*3+2] := loop * 2;
  56.     pal[(127-loop)*3+2] := loop * 2;
  57.     pal[(loop+128)*3+2] := loop * 2;
  58.     pal[(191-loop)*3+2] := loop * 2;
  59.     pal[(loop+192)*3+2] := loop * 2;
  60.     pal[(255-loop)*3+2] := loop * 2;
  61.   end;
  62.   setpalette;
  63. end;
  64.  
  65. procedure CalcSinus(SinPar:byte);
  66. begin
  67.   for n := 0 to SinLen do
  68.     SinTab[n] := round(sin(n*SinPar*pi/SinLen)*SinAmp)+SinOfs;
  69. end;
  70.  
  71. procedure WaitRetrace;assembler;
  72. asm
  73.   mov     dx,3DAh
  74. @loop1:
  75.   in      al,dx
  76.   and     al,08h
  77.   jz      @loop1
  78. @loop2:
  79.   in      al,dx
  80.   and     al,08h
  81.   jz      @loop2
  82. end;
  83.  
  84. procedure SetBob(X,Y:word;W,H:byte;Sprite:pointer);assembler;
  85. asm
  86.   push    ds                       { DS sichern }
  87.   lds     si,[Sprite]              { DS:SI mit dem Spritepointer laden }
  88.   mov     es,vga                   { VGA-Segment nach ES }
  89.   cld
  90.   mov     ax,Y                     { Offset des Bobs berechnen }
  91.   shl     ax,6
  92.   mov     di,ax
  93.   shl     ax,2
  94.   add     di,ax
  95.   add     di,X
  96.   mov     bh,H
  97.   mov     cx,320
  98.   sub     cl,W
  99.   sbb     ch,0
  100. @L:
  101.   mov     bl,W
  102. @L2:
  103.   lodsb                            { Wert laden }
  104.   or      al,al                    { Wert = 0 ? }
  105.   jz      @S                       { Wenn ja, nicht erhöhen }
  106.   mov     dl,es:[di]               { Pixelwert vom VGA holen }
  107.   add     dl,al                    { Wert erhöhen }
  108.   and     dl,63
  109.   mov     es:[di],dl               { und neuen Pixelwert schreiben }
  110. @S:
  111.   inc     di                       { nächste Pixelposition }
  112.   dec     bl                       { Zähler dekrementieren }
  113.   jnz     @L2                      { wenn <> 0 dann innerer Loop }
  114.   add     di,cx                    { nächste Zeile auf VGA }
  115.   dec     bh                       { Zähler dekrementieren }
  116.   jnz     @L                       { wenn <> 0 dann äußerer Loop }
  117.   pop     ds
  118. end;
  119.  
  120.  
  121. begin
  122.   asm mov ax,13h; int 10h end;
  123.   BluePal;
  124.   randomize;
  125.   CalcSinus(random(8));  { Sinustabelle berechnen }
  126.   I1 := 0;               { Indizes für Sinustabelle }
  127.   I2 := 200;
  128.   J1 := 0;
  129.   J2 := 200;
  130.   repeat
  131.     X := SinTab[I1]+SinTab[I2];  { Werte addieren }
  132.     Y := SinTab[J1]+SinTab[J2];
  133.     inc(I1,2);                   { Neue Indexwerte }
  134.     inc(I2,3);
  135.     inc(J1);
  136.     inc(J2,2);
  137.     waitretrace;
  138.     SetBob(80+X,Y,16,16,addr(SprPic)); { Bob zeichnen }
  139.   until keypressed;
  140.   readkey;
  141.   asm mov ax,3; int 10h end;
  142. end.
  143.